module hip.assets.csv;
import hip.asset;
public import hip.api.data.csv;
public import hip.data.csv;

class HipCSV : HipAsset, IHipCSV
{
    CSV csv;
    this()
    {
        super("HipCSV");
        _typeID = assetTypeID!(HipCSV);
    }

    bool loadFromMemory(string data, const char fieldDelimiter = ',', const char textDelimiter = '"', string path = "")
    {
        this.csv = parseCSV(data, fieldDelimiter, textDelimiter, path);
        return csv.data.length > 0;
    }
    bool loadFromFile(string file, const char fieldDelimiter = ',', const char textDelimiter = '"')
    {
        import hip.error.handler;
        import hip.filesystem.hipfs;
        HipFS.readText(file).addOnError((string err)
        {
            ErrorHandler.showErrorMessage("Could not load CSV File", file);
        }).addOnSuccess((in ubyte[] data)
        {
            loadFromMemory(cast(string)data, fieldDelimiter, textDelimiter, file);
        });

        return true;
    }

    string opIndex(size_t x, size_t y) const{return csv.data[y][x];}
    
    override void onFinishLoading(){}
    override void onDispose(){}
    bool isReady(){return csv.data.length > 0;}
    size_t rows() const {return csv.data.length;}
    size_t columns() const {return csv.data[0].length;}
    string path() const {return csv.path;}
    const(string[]) getRow(size_t row) const @nogc{return csv.data[row];}
    
}